﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using GAIQ;

namespace DCIMAP.GANS.GeneticAlgorithms.Legacy
{

    [Serializable]
    class IQEvaluator : GeneEvaluator
    {
        private readonly int[] sequence; /// Последовательность, в которой надо найти закономерность

        public IQEvaluator(int[] sequence)
        {
            this.sequence = sequence;
        }

        /// <summary>
        /// Функция приспособленности имеет вид:
        /// 1/(2+max_n|Yn-Xn|) если max!=0
        /// 1/(2+max_n|Yn-Xn|) + 1/(1+gene.Length) если max=0
        /// где
        ///     Yn - значение, вычисленное геном
        ///     Xn - реальное значение в данной последовательности.
        /// max_n|Yn-Xn| - максимальное значений среди разностей для всех членов данной последовательности
        /// Таким образом, если функция приспособленности >= 0.5, то ген является решением и далее
        /// чем ближе к 1, тем это решение короче по числу узлов дерева.
        /// </summary>
        public override double Evaluate(Gene gene)
        {
            TreeGene g = (TreeGene)gene;
            bool flag = g.args(); 
            int n = sequence.Length;
            int max = 0;
            if (flag)
                n--;
            for (int i = 0; i < n-1; i++)
            {
                int var;
                try
                {
                    if (flag)
                        var = Math.Abs(sequence[i + 2] - g.count(sequence[i], sequence[i + 1]));
                    else
                        var = Math.Abs(sequence[i + 1] - g.count(sequence[i], sequence[i]));
                }
                catch (System.OverflowException e)
                {
                    var = System.Int32.MaxValue;
                }
                if (var > max)
                    max = var;
            }
            if (max != 0)
                return 1.0 / (2 + max);
            return (1.0 / 2 + 1.0 / (1 + g.NodeCode.Length));
        }    
    }
}